package com.zj.esproxy.interfaces;

import com.alibaba.fastjson.JSONObject;
import com.zj.baseproxy.model.Page;
import com.zj.esproxy.wrapper.EsWrapper;

/**
 * es基础模板
 *
 * @author arthur_zhou
 * @date 2023/10/8 10:48
 */
public interface EsBaseMapper<Dto> extends IGetter<Dto> {

    /**
     * es取数据通用方法 返回响应json
     *
     * @param json 请求json
     * @return 响应json
     */
    JSONObject getJson(String json);

    /**
     * es取数据通用方法 返回响应json
     *
     * @param wrapper 条件拼接器
     * @return 响应json
     */
    JSONObject getJson(EsWrapper wrapper);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param json 请求json
     * @return 分页
     */
    Page<Dto> get(String json);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param json  请求json
     * @param clazz 返回类型
     * @return 分页
     */
    <T> Page<T> get(String json, Class<T> clazz);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param wrapper 条件拼接器
     * @return 分页
     */
    Page<Dto> get(EsWrapper wrapper);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param wrapper 条件拼接器
     * @param clazz   返回类型
     * @return 分页
     */
    <T> Page<T> get(EsWrapper wrapper, Class<T> clazz);


    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param json 请求json
     * @return 分页
     */
    Page<Dto> getDistinct(String json);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param json  请求json
     * @param clazz 返回类型
     * @return 分页
     */
    <T> Page<T> getDistinct(String json, Class<T> clazz);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param wrapper 条件拼接器
     * @return 分页
     */
    Page<Dto> getDistinct(EsWrapper wrapper);

    /**
     * es取数据通用方法 配合@JSONField(name = "XXX")使用
     *
     * @param wrapper 条件拼接器
     * @param clazz   返回类型
     * @return 分页
     */
    <T> Page<T> getDistinct(EsWrapper wrapper, Class<T> clazz);
}
